package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

type httpServer struct {
}

func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(r.URL.Path)) // 向响应中写入访问的路径
}

func demo(w http.ResponseWriter, r *http.Request) {
	fmt.Println("demo")
	fmt.Fprintf(w, "hello word") //这个写入到w的是输出到客户端的
}

func zilong(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong")
	fmt.Fprintf(w, "hello zilong") //这个写入到w的是输出到客户端的
}

func zilong11(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello zilong111 666") //这个写入到w的是输出到客户端的
}

func zilong22(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello zilong111 123123123") //这个写入到w的是输出到客户端的
}

func zilong33(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello 88888888888") //这个写入到w的是输出到客户端的
}

func zilong44(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello 9999999") //这个写入到w的是输出到客户端的
}

func zilong55(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello 555555") //这个写入到w的是输出到客户端的
}

func zilong66(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello 666666666") //这个写入到w的是输出到客户端的
}

func zilong77(w http.ResponseWriter, r *http.Request) {
	fmt.Println("zilong111")
	fmt.Fprintf(w, "hello 1212121212121") //这个写入到w的是输出到客户端的
}

func spring(w http.ResponseWriter, r *http.Request) {
	fmt.Println("spring")
	fmt.Fprintf(w, "hello spring") //这个写入到w的是输出到客户端的
}

func main() {
	var server httpServer
	// Handle 方法设置访问的路由
	http.Handle("/test", server)
	http.Handle("/test1", server)

	// 使用HandleFunc设置访问的路由
	http.HandleFunc("/demo", demo)

	// 使用HandleFunc设置访问的路由
	http.HandleFunc("/zilong", zilong)

	http.HandleFunc("/lcg", zilong11)
	http.HandleFunc("/lcg6", zilong22)
	http.HandleFunc("/lcg8", zilong33)
	http.HandleFunc("/lcg9", zilong44)
	http.HandleFunc("/lcg10", zilong55)
	http.HandleFunc("/lcg11", zilong66)
	http.HandleFunc("/lcg12", zilong77)

	// 使用HandleFunc设置访问的路由
	http.HandleFunc("/spring", spring)

	go func() {
		// 设置监听的端口
		err := http.ListenAndServe(":7575", nil)

		if err != nil {
			log.Fatal(err)
		}
	}()

	fmt.Println("server start, listening on 7575")

	//fmt.Println(000000000)
	//
	// 等待终端信号来优雅的关闭服务器，为关闭服务器 设置一个5秒的超时
	quit := make(chan os.Signal, 1) //创建一个收信号的通道
	//kill 默认会发送 syscall.SIGTERM 信号
	//kill -2 发送   syscall.SIGINT  信号，我们常用的ctrl+c 就是触发系统的SIGINT信号
	//kill -9 发送   syscall.SIGKILL 信号，但是不能被捕获，所以不需要添加它
	//signal.Notify把收到的syscall.SIGINT或者syscall.SIGTERM信号转发给quit
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit //阻塞在此，当接收到上述梁总信号时才会往下执行
	//创建一个5米秒超时的context
	_, cancel := context.WithTimeout(context.Background(), time.Second*5)
	defer cancel()

	fmt.Println("over")

	// 5秒内优雅的关闭服务(将未处理完的请求处理完再关闭服务，超过5秒就超时退出)

}
